// 应用主模块
import {
  registerServiceWorker, clearAllCaches, unregisterAllServiceWorkers, updateStatus,
} from './service-worker';
import { initNetworkStatus, setupPeriodicServerCheck, setupPeriodicNetworkCheck, networkStatusMonitor } from './network-status';
import { loadData, displayData } from './data-manager';
import networkService from './network-service';
import errorHandler, { ErrorType, ErrorSeverity } from './error-handler.js';

/**
 * 应用配置
 */
const appConfig = {
  isDevelopment: location.hostname === 'localhost' || location.hostname === '127.0.0.1',
  // 网络请求和检查配置
  networkConfig: {
    // 定期网络状态检查间隔（毫秒），设为0表示禁用
    checkInterval: 0, // 完全禁用定期检查
    // 是否在网络恢复时自动刷新数据
    refreshOnReconnect: false, // 禁用网络恢复时的自动数据刷新
    // 是否启用网络稳定性检查
    enableStabilityCheck: false
  }
};

/**
 * 初始化应用
 */
export function initApp() {
  try {
    // 初始化错误处理
    errorHandler.initGlobalErrorHandling();
    
    console.log(`应用初始化，环境: ${appConfig.isDevelopment ? '开发' : '生产'}`);

    // 初始化网络状态检测
    initNetworkStatus();
    
    // 设置高级网络状态监控
    setupNetworkStatusMonitoring();

    if (appConfig.isDevelopment) {
      initDevelopmentMode();
    } else {
      initProductionMode();
    }

    // 设置清除缓存按钮
    setupClearCacheButton();
    
    // 设置状态管理UI链接
    setupStatusUILink();

    // 加载初始数据
    loadInitialData();
  } catch (error) {
    // 使用错误处理模块处理初始化错误
    errorHandler.handleError(
      error,
      ErrorType.CLIENT,
      ErrorSeverity.CRITICAL,
      { context: '应用初始化' }
    );
    updateStatus('初始化失败，请刷新页面重试');
    // 确保在初始化失败时也隐藏加载状态
    hideLoadingOverlay();
  }
}

/**
 * 初始化开发模式
 */
function initDevelopmentMode() {
  console.log('开发环境：Service Worker 已禁用，避免缓存问题');
  updateStatus('开发环境 - 实时加载最新内容');

  // 清除现有的Service Worker和缓存
  Promise.all([
    unregisterAllServiceWorkers(),
    clearAllCaches(),
  ]).then(() => {
    // 仅在配置了检查间隔时设置定期检查
  if (appConfig.networkConfig.checkInterval > 0) {
    setupPeriodicNetworkCheck(appConfig.networkConfig.checkInterval, isAvailable => {
      if (!isAvailable) {
        updateStatus('开发服务器已关闭，请重启');
      }
    }, {
      enableStabilityCheck: appConfig.networkConfig.enableStabilityCheck
    });
    console.log(`开发环境：已设置定期网络检查，间隔 ${appConfig.networkConfig.checkInterval}ms${appConfig.networkConfig.enableStabilityCheck ? ' (包含稳定性检查)' : ''}`);
  }
  });
}

/**
 * 初始化生产模式
 */
function initProductionMode() {
  // 注册Service Worker
  window.addEventListener('load', () => {
    registerServiceWorker()
      .then(() => {
        // Service Worker注册成功
      })
      .catch(_error => {
        updateStatus('缓存功能不可用');
      });
  });
}

/**
 * 设置清除缓存按钮
 */
function setupClearCacheButton() {
  const clearCacheButton = document.getElementById('clearCacheButton');
  if (clearCacheButton) {
    clearCacheButton.addEventListener('click', clearAllCaches);
  }
}

/**
 * 加载初始数据
 */
function loadInitialData() {
  window.addEventListener('DOMContentLoaded', () => {
    // 显示加载状态
    const loadingOverlay = document.getElementById('loadingOverlay');
    if (loadingOverlay) {
      loadingOverlay.classList.remove('hidden');
      loadingOverlay.style.display = 'flex';
    }
    
    loadData(
      '/mock-data.json',
      data => {
        displayData(data);
        // 数据加载成功后隐藏加载状态
        hideLoadingOverlay();
      },
      (error, fallbackData) => {
        displayData(fallbackData);
        // 可以在这里添加错误通知
        updateStatus('使用离线数据');
        // 数据加载失败但有备用数据时也隐藏加载状态
        hideLoadingOverlay();
      },
    );
  });
}

/**
 * 隐藏加载状态覆盖层
 */
function hideLoadingOverlay() {
  const loadingOverlay = document.getElementById('loadingOverlay');
  if (loadingOverlay) {
    loadingOverlay.classList.add('hidden');
    // 添加小延迟以确保平滑过渡
    setTimeout(() => {
      loadingOverlay.style.display = 'none';
    }, 300);
  }
}

/**
 * 设置高级网络状态监控
 */
function setupNetworkStatusMonitoring() {
  // 添加网络状态变化监听器
  const statusListenerId = networkStatusMonitor.addListener(status => {
    console.log(`网络状态变化为: ${status}`);
    
    if (status === 'online') {
      handleNetworkOnline();
    } else {
      handleNetworkOffline();
    }
  });
  
  // 应用卸载时移除监听器，防止内存泄漏
  window.addEventListener('unload', () => {
    networkStatusMonitor.removeListener(statusListenerId);
  });
}

/**
 * 处理网络连接恢复
 */
function handleNetworkOnline() {
  updateStatus('网络已连接，正在同步待处理的请求...');
  
  // 检查请求队列状态
  networkService.getQueueStatus()
    .then(status => {
      if (status.pending > 0) {
        updateStatus(`发现 ${status.pending} 个待处理请求，正在尝试同步...`);
        
        // 尝试请求后台同步
        if (!appConfig.isDevelopment && 'serviceWorker' in navigator && 'SyncManager' in window) {
          navigator.serviceWorker.ready
            .then(registration => registration.sync.register('apiQueue'))
            .then(() => {
              updateStatus(`后台同步已请求，正在处理 ${status.pending} 个待处理请求`);
            })
            .catch(error => {
              console.warn('请求后台同步失败:', error);
              updateStatus(`网络已连接，但无法自动同步请求`);
            });
        }
      } else {
        updateStatus('网络已连接，没有待处理的请求');
      }
      
      // 只在配置允许时才重新加载数据
      if (appConfig.networkConfig.refreshOnReconnect) {
        loadData('/mock-data.json', 
          data => {
            // 只在有新数据时更新显示，避免不必要的UI更新
            if (JSON.stringify(data) !== JSON.stringify(window.currentData)) {
              window.currentData = data;
              displayData(data);
            }
          },
          () => {/* 忽略错误，保留现有数据 */}
        );
      }
    })
    .catch(error => {
      console.error('检查请求队列状态失败:', error);
      updateStatus('网络已连接，但无法检查请求队列');
    });
}

/**
 * 处理网络连接断开
 */
function handleNetworkOffline() {
  updateStatus('网络连接已断开，应用切换到离线模式');
  
  // 可以在这里添加离线模式的特定逻辑
}

/**
 * 设置状态管理UI链接
 */
function setupStatusUILink() {
  const statusUILink = document.getElementById('statusUILink');
  if (statusUILink) {
    statusUILink.addEventListener('click', (e) => {
      e.preventDefault();
      window.open('/status-ui.html', '_blank', 'width=800,height=600');
    });
  } else {
    // 如果没有状态UI链接元素，创建一个
    createStatusUILink();
  }
}

/**
 * 创建状态管理UI链接
 */
function createStatusUILink() {
  // 查找合适的位置插入状态UI链接
  const header = document.querySelector('header');
  if (header) {
    const statusLink = document.createElement('a');
    statusLink.href = '/status-ui.html';
    statusLink.target = '_blank';
    statusLink.innerText = '状态管理';
    statusLink.style.marginLeft = '20px';
    statusLink.style.color = '#3498db';
    statusLink.style.textDecoration = 'none';
    
    statusLink.addEventListener('click', (e) => {
      e.preventDefault();
      window.open('/status-ui.html', '_blank', 'width=800,height=600');
    });
    
    header.appendChild(statusLink);
  }
}

/**
 * 导出应用配置
 */
export { appConfig };
